package com.itheima.factory;

import com.fasterxml.jackson.annotation.JsonTypeInfo;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/*
    目的：加载bean.properties属性文件，读取内容，反射创举service实现类对象，存储起来
    要做的事：
        1 加载bean.properties配置文件
        2 读取属性文件中的内容
        3 反射创建对象，存储map集合中
        4 对外提供方法，根据名称获取对应的service对象
 */
public class BeanFactory{

    //创建map集合，用来存储实现类对象
    private static Map<String,Object> cache=new HashMap<>();

    static {
        //1 加载bean.properties配置文件
        //1.1 创建Properties对象
        Properties properties=new Properties();
        //1.2 获取流对象
        InputStream is = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
        //1.3 调用load方法
        try {
            properties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //2 读取属性文件中的内容
        //2.1 获取所有的名称，也就key
        Set<String> names = properties.stringPropertyNames(); //companyService、deptService、userService
        //2.2 遍历所有的key
        names.forEach(name->{
            //2.3 根据key获取对应value值，也就是全类名
            String className = properties.getProperty(name); //com.itheima.service.impl.CompanyServiceImpl
            //3 反射创建对象，存储map集合中
            //3.1 反射创建对象
            try {
                Object bean = Class.forName(className).newInstance();
                //3.2将service对象保存到map集合中
                cache.put(name,bean);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
    //4 对外提供方法，根据名称获取对应的service对象
    public static Object getBean(String name){
        return cache.get(name);
    }
    public static<T> T getBean(String name,Class<T> tClass){
        return (T) cache.get(name);
    }
}
